//
// Created by denglibin on 2021/4/16.
//

#ifndef ALGORITHM_DOUBLE_LINK_LIST_H
#define ALGORITHM_DOUBLE_LINK_LIST_H
//双向链表
typedef struct node{
    int key;
    int value;
    struct node* next;
    struct node* prev;
}Node;
/**
 * 创建节点
 * @param key
 * @param value
 * @return
 */
Node* createNode(int key, int value);

/**
 * 打印
 * @param node
 */
void printNode(Node* node);

/**
 * 释放节点
 * @param node
 */
void freeNode(Node* node);


typedef struct double_link_list{
    int capacity; //容量
    int size; //大小
    Node* head; //头部节点
    Node* tail; //尾部节点
}DoubleLinkList;

/**
 * 创建
 * @param capacity
 * @return
 */
DoubleLinkList * createDoubleLinkList(int capacity);

/**
 * 打印
 * @param doubleLinkList
 */
void printList(DoubleLinkList* doubleLinkList);

/**
 * 头部添加节点
 * @param doubleLinkList
 * @param node
 */
void insertHead(DoubleLinkList* doubleLinkList, Node* node);
/**
 * 尾部添加节点
 * @param doubleLinkList
 * @param node
 */
void insertTail(DoubleLinkList* doubleLinkList, Node* node);

/**
 * 移除节点
 * @param doubleLinkList
 * @param node 移除的节点（为NULL则移除尾部节点）
 */
void removeNode(DoubleLinkList* doubleLinkList, Node* node);

/**
 * 移除尾部
 * @param doubleLinkList
 */
void removeTail(DoubleLinkList* doubleLinkList);

/**
 * 移除头部
 * @param doubleLinkList
 */
void removeHead(DoubleLinkList* doubleLinkList);

/**
 * 弹出头部节点
 * @param doubleLinkList
 * @return
 */
Node * popHead(DoubleLinkList* doubleLinkList);

/**
 * 弹出尾部节点
 * @param doubleLinkList
 * @return
 */
Node * popTail(DoubleLinkList* doubleLinkList);
/**
 * 释放
 * @param doubleLinkList
 */
void freeDoubleLinkList(DoubleLinkList* doubleLinkList);

#endif //ALGORITHM_DOUBLE_LINK_LIST_H
